<?php

 function get_bin_name($file)
 {
 	return strip_extension($file).".bin.php";
 }

 function starts_with($str, $part)
 {
 	return substr($str,0,strlen($part))==$part;
 }
 
 function ends_with($str, $part)
 {
 	return substr($str, -1*strlen($part))==$part; 	
 }
 
 //coje un string y devuelve el código php que lo generaría
 function encode_string($str)
 {
	$ret = $str;
	
	$ret = str_replace("\\", "\\\\", $ret);
	$ret = str_replace("\n", "\\n", $ret);
	$ret = str_replace("\r", "\\r", $ret);
	$ret = str_replace("\l", "\\l", $ret);
	$ret = str_replace("\f", "\\f", $ret);
	$ret = str_replace("\v", "\\v", $ret);
	$ret = str_replace("\t", "\\t", $ret);	
	$ret = str_replace("\$", "\\\$", $ret);
	$ret = str_replace("\"", "\\\"", $ret);
	
	return $ret;
 }
 
 function get_extension($str)
 {
 	$ix = strrpos($str, ".");
 	return substr($str, $ix+1);
 }
 
 function strip_extension($filename)
 {
 	return basename($filename, ".".get_extension($filename));
 }
 
 function strip_first_line($str)
 {
 	return substr($str, strpos($str,"\n")+1);
 }
 
 function rex_find_all($haystack, $pattern, $offset=0)
 {
 	//global $debug_level;
 	
 	$ret = array();
 	if(strlen($haystack)>0)
 	{
		preg_match_all($pattern, $haystack, $matches);
		
		$ix = -1;
		foreach($matches[0] as $match)
		{
			$ix = strpos($haystack, $match, $ix+1);
			$ret[] = $ix;
		}
 	}
 	return $ret;
}

 
 //Devuelve las posiciones de todas las ocurrencias de un string en otro
 function find_all($haystack, $needle, $offset=0)
 {
 	global $debug_level; 	
 	if($debug_level>2) echo "Find all '$needle' in ".substr($haystack,0, 25)."...\n"; 	 	
 	
 	$ret = array();
 	if(strlen($haystack)>0)
 	{
		$ix = 0; 	
		do
		{
			$ix = strpos($haystack, $needle, $ix+1);
			if($debug_level>3) echo "Encontrado en $ix\n";
			if($ix) $ret[] = $ix;
		}
		while($ix);
 	}
 	return $ret;
 }
 
function rex_pos_after($string, $pattern) { return rex_pos($string, $pattern, true); }
function rex_pos_before($string, $pattern) { return rex_pos($string, $pattern, false); }
function rex_pos($string, $pattern, $after)
{
	$cnt = preg_match($pattern, $string, $matches);
	if($cnt===false) return -1;
	//print_r($matches);
	$needle = $matches[0];
	
	$inicio = strpos($string, $needle)+($after?strlen($needle):0);
	
	return $inicio;
}


function get_node_content($xml, $tag, $attr_name, $attr_value)
{
	$debug = false;

	$n_args = func_num_args();
	if($n_args==2)
		$rex = "/\\<$tag.*?\\>/s";
	else if($n_args==3)
		$rex = "/\\<$tag\\b.*?\\bid\\=\"$attr_name\".*?\\>/s";
	else if($n_args==4)
		$rex = "/\\<$tag\\b.*?\\b$attr_name\\=\"$attr_value\".*?\\>/s";

	$out = "";
	$inicio = rex_pos_after($xml, $rex);
	
	if($inicio==-1) return "";
	
	$inicio_bf = rex_pos_before($xml, $rex);
	$out.=substr($xml, $inicio_bf, $inicio-$inicio_bf);
	$subcontent = substr($xml, $inicio);
	$opened = 1;
	$closed =0;
	$i = 0;
	while($opened>$closed && $i<20)
	{
		$ix_open = rex_pos_before($subcontent, "/\\<$tag\\b.*?\\>/s");
		$ix_close = rex_pos_before($subcontent, "/\\<\\/$tag\\b\\s*?\\>/s");
		if($debug) echo "open, close = $ix_open $ix_close\n";
		
		//si ya no hay, hemos terminado
		if($ix_open==-1 && $ix_close==-1) break;
		
		//si el siguiente que hay es de cierre, lo apuntamos, y empiezo después de el
		if(($ix_close<$ix_open && $ix_close>-1) || ($ix_open==-1))
		{
			$closed++;
			$ix = $ix_close;
			$ix_aft = rex_pos_after($subcontent, "/\\<\\/$tag\\b\\s*?\\>/s");
		}
		//si el siguiente es de apertura
		else
		{
			$opened++;
			$ix = $ix_open;
			$ix_aft = rex_pos_after($subcontent, "/\\<$tag\\b.*?\\>/s");
		}
		
		$out.=substr($subcontent,0, $ix_aft);
		$subcontent = substr($subcontent, $ix_aft);
		
		$i++;
	}
	
	return $out;
}


 
 ?>